Make balloon driver arch-neutral.
authorkaf24@firebug.cl.cam.ac.uk <kaf24@firebug.cl.cam.ac.uk>
Thu, 8 Dec 2005 14:33:10 +0000 (15:33 +0100)
committerkaf24@firebug.cl.cam.ac.uk <kaf24@firebug.cl.cam.ac.uk>
Thu, 8 Dec 2005 14:33:10 +0000 (15:33 +0100)
Signed-off-by: Dan Magenheimer <dan.magenheimer@hp.com>
linux-2.6-xen-sparse/drivers/xen/balloon/balloon.c
linux-2.6-xen-sparse/include/asm-xen/asm-i386/page.h
linux-2.6-xen-sparse/include/asm-xen/asm-ia64/hypercall.h
linux-2.6-xen-sparse/include/asm-xen/asm-ia64/hypervisor.h
linux-2.6-xen-sparse/include/asm-xen/asm-x86_64/page.h

index 15d18e917e2c60a9a21f52b6ed60b68942f90de5..5ffd8a48faa03418202c41132b983077f1694ae2 100644 (file)
@@ -192,8 +192,8 @@ static int increase_reservation(unsigned long nr_pages)
                page = balloon_retrieve();
                BUG_ON(page == NULL);
 
-               pfn = page - mem_map;
-               BUG_ON(phys_to_machine_mapping[pfn] != INVALID_P2M_ENTRY);
+               pfn = page_to_pfn(page);
+               BUG_ON(phys_to_machine_mapping_valid(pfn));
 
                /* Update P->M and M->P tables. */
                set_phys_to_machine(pfn, mfn_list[i]);
@@ -253,8 +253,8 @@ static int decrease_reservation(unsigned long nr_pages)
                        break;
                }
 
-               pfn = page - mem_map;
-               mfn_list[i] = phys_to_machine_mapping[pfn];
+               pfn = page_to_pfn(page);
+               mfn_list[i] = pfn_to_mfn(pfn);
 
                if (!PageHighMem(page)) {
                        v = phys_to_virt(pfn << PAGE_SHIFT);
@@ -444,6 +444,9 @@ static int __init balloon_init(void)
 
        IPRINTK("Initialising balloon driver.\n");
 
+       if (xen_init() < 0)
+               return -1;
+
        current_pages = min(xen_start_info->nr_pages, max_pfn);
        target_pages  = current_pages;
        balloon_low   = 0;
@@ -465,7 +468,7 @@ static int __init balloon_init(void)
     
        /* Initialise the balloon with excess memory space. */
        for (pfn = xen_start_info->nr_pages; pfn < max_pfn; pfn++) {
-               page = &mem_map[pfn];
+               page = pfn_to_page(pfn);
                if (!PageReserved(page))
                        balloon_append(page);
        }
index 4813c6a505e121295e6165cd831123b1567446cc..d27891d7a222c8d7a673802565e875bde2278858 100644 (file)
@@ -65,6 +65,8 @@
 extern unsigned long *phys_to_machine_mapping;
 #define pfn_to_mfn(pfn)        \
 (phys_to_machine_mapping[(unsigned int)(pfn)] & ~(1UL<<31))
+#define        phys_to_machine_mapping_valid(pfn) \
+       (phys_to_machine_mapping[pfn] != INVALID_P2M_ENTRY)
 static inline unsigned long mfn_to_pfn(unsigned long mfn)
 {
        unsigned long pfn;
index fcfd4a5890dc5f8287bf1261b8e26d7f13eee8e2..e0b41f57eab13b7339a353fe50ed7d88ab07b201 100644 (file)
@@ -355,34 +355,27 @@ HYPERVISOR_multicall(
 #endif
     return 1;
 }
+#endif
 
 static inline int
 HYPERVISOR_update_va_mapping(
     unsigned long va, pte_t new_val, unsigned long flags)
 {
-#if 0
-    int ret;
-    unsigned long ign1, ign2, ign3;
-
-    __asm__ __volatile__ (
-        TRAP_INSTR
-        : "=a" (ret), "=b" (ign1), "=c" (ign2), "=d" (ign3)
-       : "0" (__HYPERVISOR_update_va_mapping), 
-          "1" (va), "2" ((new_val).pte_low), "3" (flags)
-       : "memory" );
-
-    if ( unlikely(ret < 0) )
-    {
-        printk(KERN_ALERT "Failed update VA mapping: %08lx, %08lx, %08lx\n",
-               va, (new_val).pte_low, flags);
-        BUG();
-    }
+    /* no-op */
+    return 1;
+}
 
+static inline int
+HYPERVISOR_memory_op(
+    unsigned int cmd, void *arg)
+{
+    int ret;
+    __asm__ __volatile__ ( ";; mov r14=%2 ; mov r15=%3 ; mov r2=%1 ; break 0x1000 ;; mov %0=r8 ;;"
+        : "=r" (ret)
+        : "i" (__HYPERVISOR_console_io), "r"(cmd), "r"(arg)
+        : "r14","r15","r2","r8","memory" );
     return ret;
-#endif
-    return 1;
 }
-#endif
 
 static inline int
 HYPERVISOR_event_channel_op(
index da4303f9b698a9dc1ee4e79febd3e6acb8af9c63..494bd5bbde3b3ed0386df015e774510786c49743 100644 (file)
@@ -52,4 +52,19 @@ void force_evtchn_callback(void);
 #define        mfn_to_pfn(x)   (x)
 #define machine_to_phys_mapping 0
 
+// for drivers/xen/balloon/balloon.c
+#ifdef CONFIG_XEN_SCRUB_PAGES
+#define scrub_pages(_p,_n) memset((void *)(_p), 0, (_n) << PAGE_SHIFT)
+#else
+#define scrub_pages(_p,_n) ((void)0)
+#endif
+#define        pte_mfn(_x)     pte_pfn(_x)
+#define INVALID_P2M_ENTRY      (~0UL)
+#define __pte_ma(_x)   ((pte_t) {(_x)})
+#define phys_to_machine_mapping_valid(_x)      (1)
+#define        kmap_flush_unused()     do {} while (0)
+#define set_phys_to_machine(_x,_y)     do {} while (0)
+#define xen_machphys_update(_x,_y)     do {} while (0)
+#define pfn_pte_ma(_x,_y)      __pte_ma(0)
+
 #endif /* __HYPERVISOR_H__ */
index d454123723a7d1d0e09cd39b9aa8277969096c4e..cd186ea8ffe334bc1c9fb34db3d98cc8083fad1a 100644 (file)
@@ -67,6 +67,8 @@ void copy_page(void *, void *);
 extern unsigned long *phys_to_machine_mapping;
 #define pfn_to_mfn(pfn)        \
 (phys_to_machine_mapping[(unsigned int)(pfn)] & ~(1UL << 63))
+#define        phys_to_machine_mapping_valid(pfn) \
+       (phys_to_machine_mapping[pfn] != INVALID_P2M_ENTRY)
 static inline unsigned long mfn_to_pfn(unsigned long mfn)
 {
        unsigned long pfn;